Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
Проблема решена. Обнаружилась довольно неожиданно - заметил, что во время крита герой не разбивал лицо сам себе, начал искать модификаторы атаки - у героя было 3 пустышки с нулевыми значениями на основе "ракет". При всех пустых значениях вылетает невидимая ракета по самому себе.
not_name:
я карту посмотрел, да, пытался сделать похожее
только там с очередью приказов шляпа выходит, поэтому я лучше сделаю все визуально
в общем, реализовал, как и говорил выше - при смерти сразу воскрешаю героя на месте гибели, пауза, анимация, таймер, по прошествии таймера - выдаю все нужное, при повторной смерти - забираю
адекватно работает с крестами
По новым правилам выдачи ресурсы проектов 3 уровня попадают на главную. Самый последний ресурс war3 будет отображаться на главной, так что дублировать ресурсы не имеет смысла.
Я бы на вашем месте использовал "Custom Script", то есть вставил локальные переменные на языке jass. Вышло бы приблизительно так:
Вот рабочий триггер. Никаких глобальных переменных. Работает со множествами игроков и юнитов. Не тормозит карту.
В условиях: (Ability being cast) равно "Здесь поставь способность которая применяется на юнита"
Описываю действия:
Создаем локальную переменную юнита
Даем юниту на которого применяется способность "Невидимость", способность "Змеиная ловкость"
В локальную переменную юнита вписываем юнита на которого применена способность
Ждем тридцать секунд, то есть столько времени, сколько у юнита будет доп. способность "Змеиная ловкость"
По истечении времени забираем у юнита доп. способность "Змеиная ловкость"
В пятой строке 'AEev' - это код способности "Змеиная ловкость"
Если что-то не понятно - обращайся. Напоминаю - триггер полностью играбельный! К комментарию добавляю карту с рабочим триггером:
Bravotan, вот список функций (так же есть в теме с мх)
Функций очень много, некоторые работают своеобразно читайте тему с мх и задавайте там вопросы по функциям.
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано
Карта со всеми утечками и описанием их.
Вместо проклятия банши можно юзать туман(не рекоменд) или безмолвие(там есть вроде бы шанс промаха).
Ещё можно сделать ауру на основе пламени феникса, которое действует на своих.
Юнит повреждён
урон меньше 1
источник - союзный герой
дать уклонение
вейт/таймер
убрать уклонение если триг юнит не имеет баффа пламени(длительность регулируем)
1
Определил причину невидимости модели после сохранения в war3me. В Geoset Animation Manager должна стоять Alpha 1, а он почему-то делает 0 или -1.
Поставил в Geoset Animation Manager не глобальные Color и Alpha, а для первых кадров всех 6 анимаций. Стало всё нормально и триггерные костыли не нужны.
Модель красного свечения ауры на юнитах:
Настройки нужно немного другие, наземные, враги, организмы, нейтральные. Там далеко не так как написано работает фильтр, некоторые критерии работают только совместно. Где то даже была статья как делать такие настройки, чтобы работало только на нужные цели.
Ну у мастера клинка способность то посложнее...
Вот пример:
Для начала нам нужно создать иллюзии героя, а потом скрыть всех их, так же сделав визуальный эффект (если что то зеленые тени, это снаряды).
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
Не понял что ты написал, если имеешь в виду удалить героя (RemoveUnit), то это событие никогда не запустит поток, так как объекта то уже нет (удален). Не должно по идее. Во-вторых, нельзя удалить событие. Событие обычно вешают (регистрируют) на объекты (юниты, игроки и др), большая часть стандартных событии (юнит умирает, юнит применяет абилу и др короче общие события) - вешают (регистрируют) на игроков. Короче событие - рычаг, который фиксирует изменения объекта. Есть другие еще событие со временем - "запускать каждые ... секунд" - тоже рычаг, но переменных не дает (типа Dying Unit(), GetTriggerUnit() и др)
Если смотреть по поводу того утечек и как лучше сделать/оптимизировать случаи с единичными событиями, которые вешают на одного юнита:
есть два варианта либо вешаешь все на один триггер события разных юнитов (еще нужно в некоторых случаях запихивать юнитов в группу для проверки, если там такой юнит есть, то не нужно добавлять) и не париться (рабочий вариант). Пример_GUI_Impetus,
Или создаешь каждый раз новый триггер, регистрируешь на него событие юнита (пример при атаке), (так было сделано в доте, видимо для успешной атаки, типа отслеживаешь что это был физический удар, скилл Impetus), потом ссылки на action и condition запоминаешь в переменные или в хэшз, затем удаляешь условие/действие, и триггер удалить. Условие можно не удалять, кто-то писал что не нужно
Можно привести к моему выводу, что событие не удалить. Тестировал давно функции ссылка на игроках, Рисую ситуацию: на игрока зарегистрировал событие (применить скилл), прикрепил также к триггеру условие и действие.
Игрок запускает способность => срабатывает событие => проходит проверка условия => действие.
Если убрать действие или условие, то рычаг все равно работает. Отсюда следует вывод: даже будь хоть выключен триггер, событие все равно работает. Функция GetTriggerEvalCount - этой функции можно проверить сколько раз запускал условие с событием. Но как-то пробовал еще и без условия проверить, прокатывает и на событие походу (точнее это счетчик на событие). Так как рычагом является игрок. А если рычагом станет не игрок, а юнит (часто систему урона на него вешают), то там юнита можно удалить, и событие никогда не заработает, так как его уже нет
Что хочу сказать. Если у тебя 50 триггерных скилов, и 50 триггеров с одним и тем же событием, лучше его оптимизировать, на одно событие. Где-то была ссылка
Alexey103, а у меня работает, проверял. тут ошибка в названии переменной, скорее всего, зачем ты задал такое. Мб оно слишком длинное и через нижнее подчеркивание? и путь модель указывают в jass не через один обратный слэш "/", а через двойной слэш "//". Это на гуи один, на джаз два слэша
Было создано 22 366 679 экземпляров класса CUnitListNode, которые заняли 255.9 МБ памяти.
При очередной попытке выделения, игра упала.
Виной всему утечки памяти: за 21 минуту набралось 80 тысяч групп и 20 тысяч точек.
Также, из-за выполнения большого количества кода, сильно лагает.
На стадии выбора героя (первые две минуты), выполняется 550 000 операций в секунду, а далее — 1 200 000.
Для сравнения: лимит потока — 300 000 операций.
Хорошо, что ты приложил карту, так как в логе маловато информации.
ScopteRectuS, ну как я и догадывался, что идет рекурсия.
10 событий - юнит получает урон, на одного юнита... Нужны именно такого типа проверки, всегда в условии триггера проверяй от кого урон и какой этот урон с помощью флага глобалки как в примере.В блоге лича хорошо описаны костыли доты, почитай для общего развития чтобы не наступать на эти грабли еще раз.
ScopteRectuS, нет, таймед лайф это своего рода бафф, он сам следит есть ли юнит. Если юнит сдохнет бафф самовыпилится самостоятельно, так что нет. Смотри баффы иллюзий и волков, они не проигрывают анимации смерти. Подбираешь бафф и все, анимации смерти невидно.
Хайдить тоже можно, под хайдом юнит нормально умирает и разлагается.
Короче, всем спасибо, пока поставлены еще количество костей, количество граней у кости и добавлены дальность атаки и цели для нее, фаталить перестало
функцию потом поменяю
Локальные переменные нельзя использовать в GUI'шных "if then else", карта просто не запустится Т.к если GUI'шные "if then else" перевести в jass, то будет функция с действиями триггера, а чуть выше функция с условиями этого же "if then else". А в этом и прикол локальных переменных, их можно использовать только в пределах функции в которой они были вызваны (созданы).
И лучше начни писать на jass, он легкий, хоть и кажется сложным после GUI
К примеру такие задачи на GUI которые буквально голову ломают - на jass делаются достаточно легко и быстро
дабы избежать конфликтов с многократными использованием
это будет проблематично на GUI
Поэтому лучше не парить голову этим, а почитать эти материалы:
Вешаешь даммиками замедление на всех юнитов кроме нужного пуджа подобравшего руну, которому даешь спецэффект с следом из изображений. Еще всем замедленным юнитам меняешь скорость анимации.
Снаряды стрелков и заклинаний не замедлятся, но в пуджах все эти хуки на триггерах, так что проверяется что время замедлено, и соответственно смещаются они меньше.
Ты случайно не знаешь как они это сделали ? (сейчас залез в мпкушник там в папке ///units озвучки лежат ... сделал тоже самое даже по сути попробовал их озвучку в мпкушник засунуть свой... не видит редактор может как то что надо еще где то прописать??? (Или нужено в War3.MPQ кидать (Просто кидал я в WC3Patch.mpq)
Да, нужно прописывать, в UI\SoundInfo\UnitAckSounds.slk
при создании предмета в какой-то точке на карте ты создаешь его с помощью координат
присвой переменной Point рандомную позицию на карте, после создавай там предмет и дамми\видимость\чупакабру
как только предмет взяли - удаляем дамми и точку из памяти
профит
Но ведь сами по себе ошибки не происходят.
Причина подобного это А) - невнимательность либо твоя либо автора В) - программное обеспечение
Что бы в дальнейшем все было окей, просто сначала потести карту полностью что бы знать что и как должно быть, а потом вноси изменения, будь внимательней.
Еще советую связаться с автором и поговорить с ним об этой проблеме, или запросить у него еще 1 исходник да бы сверЯться с ним.
Бредятина.
Делаешь спелл(как у мастера клинка) и ставишь время действия 3600(час) и уменьшаешь владельцу триггерно ману на 1, при уменьшении смотрим наличие бафа инвиза, если маны нет, снять бафф инвиза (при снятия баффа, инвиз автоматом убирается, проверено), а если нет бафа - прекратить снимать ману.
ну там стандартная гуи функция отвечает чтобы при старте игры было 6 утра, без нее будет ночь, а насчет увеличения времени суток: Дополнительно-Игровые константы, там можно увеличить время дня и ночи, и кажется настроить время восхода и заката
хочешь популярности и крупный донат?? Тогда редактор варика - точно не тот инструмент для тебя. Кроме ностальгирующих ветеранов в варик никто особо не играет, а эти сами ветераны повидали всякое, едва ли ты их удивишь настолько, что о тебе будут говорить. Замечание о выходе обновления на вар3 не вызвало даже тени мысли у приятелей-некогда-перводотеров-и-кастомных-карт-игроков снова установить варкрафт(я даже не сказал им что обновление по сути ничего не делает, просто что вышло обновление). Может только мне так везёт, но мои печальные наблюдения в том, что варик медленно но верно теряет игроков.
По крайней мере слово "перспектива" тут явно чужое.
]]Chupakabra[[, я понял. Крч на костылях придется лепить. Попробуй при выборе героя добавлять геройские абилки, а потом блочить или удалять их. Думаю, так можно добавить до 7 штук. Через ро не получается больше 5.
Если не получится - пробуй делать полностью триггерно с помощью спеллбука.
PT153, это лимит для одного игрока, то есть героя смогут нанять другие.
Нужно поставить таверне способность Продажа войск. Потом делаешь триггер:
Событие: Юнит вошёл в область (Вся игровая карта)
Условие: Триггеринг юнит равно Герой равно Да (можно этого не делать, просто исключает срабатывание триггера для каждого юнита)
Действия: несколько действий Если/То/Иначе
Если - Юнит тип (Триггеринг юнит) равно Какой-то Герой Из Таверны
То - Нейтральное здание - Удалить Какой-то Герой Из Таверны из таверны
Иначе - Ничего
И так для каждого типа героев в таверне.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
По мере работы с триггерами, в частности с триггерными способностями, разобрался и с этой проблемой(методом "тыка"). Чтобы не оставлять вопрос без ответа, сам отвечу.
Событие:
Боевая единица А - unit Атакован
P.S Постарался устранить утечки, вроде получилось.
Забыл про не большое условие.
» WarCraft 3 / Размер декорации ?
» WarCraft 3 / Напомните карту
» WarCraft 3 / Вопрос по ближней и дальней атаке.
» WarCraft 3 / Очень странный баг
» Администрация XGM / Ссылка картинкой
» WarCraft 3 / Некоторые функции юнитов
» WarCraft 3 / Ауры
» WarCraft 3 / Как ускорить работу редактора карт?
» WarCraft 3 / Юнит как Герой + его позиция
» WarCraft 3 / Проблемы утечек
» WarCraft 3 / Фаталит карта
» WarCraft 3 / Как получить кликнувшего игрока?
» WarCraft 3 / Триггерно добавляем урон герою
» WarCraft 3 / Поворот даммика
» WarCraft 3 / замедление времени
» WarCraft 3 / мини карта
» WarCraft 3 / озвучка юнита
» WarCraft 3 / Видно всю карту во время игры. КАК ИСПРАВИТЬ?
» WarCraft 3 / 3 д камера
» WarCraft 3 / Время суток...
» WarCraft 3 / Ресурсы для проекта...
» WarCraft 3 / Помогите решить проблему!!
» WarCraft 3 / Пропадают изменения